package analizadorSintactico;

import java.util.HashMap;

import analizadorLexico.Token;


public class TablaSimbolos {

	//HashMap de filas de la tabla de simbolos 
	private HashMap<String,FilaTS> ts = new HashMap<String,FilaTS>();
	
	public TablaSimbolos(){
		ts = new HashMap<String,FilaTS>();	
	}
	
	public void agregaId(String id, Integer dir,Token.Tipo tipo,Cadena constante){		
		FilaTS fila=null;
		if (!existeId(id)){
			if (constante.getContenido().equals("false"))
				fila = new FilaTS(dir,tipo,false);
			else if (constante.getContenido().equals("true"))
				fila = new FilaTS(dir,tipo,true);
		}
		ts.put(id,fila);
	}
	
	public HashMap<String,FilaTS> getHashMap(){
		return ts;
	}
	public Boolean existeId(String id){
		return ts.containsKey(id);
	}
	
	public Token.Tipo dameTipo(String id){
		FilaTS fila=null;	
					
		if(existeId(id)){
			fila=ts.get(id);
			return fila.tipo;
		}
		return Token.Tipo.error;
	}
	
	public int dameDireccion(String id){
		FilaTS fila=null;	
					
		
		if(existeId(id)){
			fila=ts.get(id);
			return fila.dir;
		}
		
		return -1;
	}
	
	public Boolean esConstante(String id){
		FilaTS fila=null;	
		if(existeId(id)){
			fila=ts.get(id);
			
			return fila.constante;	
		}

		return null;			
	}

	
	//Clase privada que contiene una fila de la tabla de simbolos
	public class FilaTS{	
		
		private int dir;
		private Token.Tipo tipo;
		private Boolean constante;
		
		private FilaTS(int dir, Token.Tipo tipo, Boolean constante){
			
			this.dir = dir;
			this.tipo = tipo;
			this.constante = constante;
		}
		
		public int getDir() {
			return dir;
		}

		public Token.Tipo getTipo() {
			return tipo;
		}

		public Boolean getConstante() {
			return constante;
		}

	}
	
}
